์์ฑ: 2026-03-04 04:03:38์์ : 2026-03-04 04:03:38
GitHub Actions๋ฅผ ์ด์ฉํ CI/CD ๊ตฌ์ถํ๊ธฐ: ๋ฐฐํฌ ์๋ํ์ ๊ธฐ์ด
๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ Pushํ๋ฉด ์๋์ผ๋ก ํ
์คํธ๋ฅผ ์คํํ๊ณ ์๋ฒ์ ๋ฐฐํฌ๊น์ง ํด์ค๋ค๋ฉด ์ด๋จ๊น์? GitHub Actions๋ ์ด ๊ณผ์ ์ ์๋ํํ๋ CI/CD(์ง์์ ํตํฉ/์ง์์ ์ ๊ณต) ๋๊ตฌ์
๋๋ค.
1. CI/CD๋ ๋ฌด์์ธ๊ฐ?
- CI (Continuous Integration): ์ฌ๋ฌ ๊ฐ๋ฐ์์ ์ฝ๋๊ฐ ์ ๊ธฐ์ ์ผ๋ก ๋น๋๋๊ณ ์๋ ํ ์คํธ๋ฅผ ํต๊ณผํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- CD (Continuous Deployment): ๋น๋๋ ์ฝ๋๋ฅผ ์ค์ ์ด์ ์๋ฒ์ ์๋์ผ๋ก ๋ฐฐํฌํ์ฌ ์ฌ์ฉ์๊ฐ ์ฆ์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
2. GitHub Actions ์์ํ๊ธฐ (.github/workflows)
ํ๋ก์ ํธ ๋ฃจํธ์ .github/workflows/deploy.yml ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
name: Java CI/CD with Gradle
on:
push:
branches: [ "main" ] # ๋ฉ์ธ ๋ธ๋์น์ ํธ์๋ ๋๋ง ์คํ
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
- name: Build with Gradle
run: ./gradlew build
- name: Docker build & push
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker build -t my-app .
docker tag my-app ${{ secrets.DOCKER_USERNAME }}/my-app:latest
docker push ${{ secrets.DOCKER_USERNAME }}/my-app:latest
- name: SSH Remote Commands (Deploy)
uses: appleboy/[email protected]
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
script: |
docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:latest
docker stop my-app || true
docker rm my-app || true
docker run -d --name my-app -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/my-app:latest3. ํต์ฌ ๊ณผ์ ์ดํดํ๊ธฐ
- Checkout: ํ์ฌ ์ ์ฅ์์ ์ฝ๋๋ฅผ GitHub Actions ์คํ๊ธฐ๋ก ๊ฐ์ ธ์ต๋๋ค.
- Build: ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํํฉ๋๋ค. ์๋ฌ๊ฐ ๋๋ฉด ๋ค์ ๋จ๊ณ๋ก ๊ฐ์ง ์๊ณ ๋ฉ์ถฅ๋๋ค.
- Docker Push: ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ Docker Hub์ ๊ฐ์ ์ ์ฅ์์ ์ ๋ก๋ํฉ๋๋ค.
- Deploy: ์ค์ ์ด์ ์๋ฒ์ ์ ์ํ์ฌ ์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๊ณ ์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ๊ต์ฒดํฉ๋๋ค.
4. ๋น๋ฐ ์ ๋ณด ๊ด๋ฆฌ (Secrets)
์๋ฒ์ ์ฃผ์, ๋น๋ฐ๋ฒํธ, SSH ํค ๋ฑ์ ์ธ๋ถ์ ๊ณต๊ฐ๋๋ฉด ์ ๋ฉ๋๋ค.
- GitHub Repository Settings -> Secrets and variables -> Actions์ ๊ฐ์ ์ ์ค์ ํ์ผ์ ์ ํ
${{ secrets.XXX }}์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
์ด์ ์๋ ๋ฐฐํฌ์ ๋ฒ๊ฑฐ๋ก์๊ณผ ์ค์์์ ๋ฒ์ด๋, ์ฝ๋ ์์ฑ์๋ง ์ง์คํ ์ ์๋ ์๋ํ๋ ํ๊ฒฝ์ ๋ง๋ค์ด ๋ณด์ธ์!